package com.guoj.rabbitmq.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.guoj.rabbitmq.entity.BrokerMessageLog;
import com.guoj.rabbitmq.mapper.BrokerMessageLogMapper;
import com.guoj.rabbitmq.service.IBrokerMessageLogService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.guoj.rabbitmq.utils.Constant;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.time.LocalDateTime;
import java.util.List;

/**
 * <p>
 *  服务实现类
 * </p>
 *
 * @author guoj
 * @since 2019-05-31
 */
@Service
public class BrokerMessageLogServiceImpl extends ServiceImpl<BrokerMessageLogMapper, BrokerMessageLog> implements IBrokerMessageLogService {

	//====================================================================================
	// mybatis-plus的lambda表达式查询可参考这篇文章: https://www.jianshu.com/p/07be9ccb3306

	/**
	 * 这里有一个惊天大坑，就是Mybatis-plus3.1.0版本没有问题，但是3.1.1版本就会报错，报结果集中找不到“next_retry”。
	 */
	//====================================================================================

	@Resource
	private BrokerMessageLogMapper brokerMessageLogMapper;

	/**
	 * 查询消息状态为0(发送中) 且已经超时的消息集合
	 * le表示：小于等于<=
	 * @return
	 */
	public List<BrokerMessageLog> query4StatusAndTimeoutMessage() {
//		QueryWrapper<BrokerMessageLog> queryWrapper = new QueryWrapper<BrokerMessageLog>();
//		queryWrapper.eq("status", Constant.ORDER_SENDING);
//		queryWrapper.le("next_retry", LocalDateTime.now());
//		List<BrokerMessageLog> bList = brokerMessageLogMapper.selectList(queryWrapper);
//		return bList;
		System.out.println("================= LocalDateTime: " + LocalDateTime.now());
		return lambdaQuery().eq(BrokerMessageLog::getStatus, Constant.ORDER_SENDING)
				.le(BrokerMessageLog::getNextRetry, LocalDateTime.now())
				.list();
	}

	/**
	 * 更新最终消息发送结果 成功 or 失败
	 * @param messageId
	 * @param status
	 */
	public void changeBrokerMessageLogStatus(String messageId, String status) {
		boolean update = lambdaUpdate().set(BrokerMessageLog::getStatus, status)
				.eq(BrokerMessageLog::getMessageId, messageId)
				.update();
		System.out.println("&&&f" + update);
	}

	/**
	 * 重新发送统计count发送次数 +1
	 * @param messageLog
	 * @param now
	 */
	public void update4ReSend(BrokerMessageLog messageLog, LocalDateTime now) {
		lambdaUpdate().set(BrokerMessageLog::getTryCount, messageLog.getTryCount() + 1)
				.set(BrokerMessageLog::getUpdateTime, now)
				.eq(BrokerMessageLog::getMessageId, messageLog.getMessageId())
				.update();
	}
}
